// 这个文件会帮我们打包packages下的模块，最终打包出js文件

// node dev.js  (要打包的名字 -f  打包格式)===argv.slice(2)
// node中的命令行参数通过 process来获取
// 所有参数 ： process.argv
import esbuild from "esbuild";
import minimist from "minimist";
import { createRequire } from "module";
import { dirname, resolve } from "path";
import { fileURLToPath } from "url";

const args = minimist(process.argv.slice(2));

// esm中使用commonjs变量
const __filename = fileURLToPath(import.meta.url); //获取当前文件的绝对路径 但是import.meta.url是以file:xxx开头的,该方法可去掉file:
const __dirname = dirname(__filename);
const require = createRequire(import.meta.url);
const target = args._[0] || "reactivity"; //打包哪个项目
const format = args.f || "iife"; //打包后的模块化规范 iife 格式：(function(){})  立即执行函数
console.log(target, format);

// 注意 在es6 __dirname是不存在的，需要使用import.meta.url
// __dirname:E:\Vue3\Vue3源码\Vue3-lesson\scripts
// 入口文件 根据命令行提供的路径来进行解析
const entry = resolve(__dirname, `../packages/${target}/src/index.ts`);
// 入口文件 根据命令行提供的路径来进行解析
const pkg = require(`../packages/${target}/package.json`);
// 根据需要进行打包
esbuild
  .context({
    entryPoints: [entry], //入口
    outfile: resolve(__dirname, `../packages/${target}/dist/${target}.js`), //出口 taget：reactivity  format：esm
    bundle: true, //是否进行打包 如果reactivity 中引用了shared，则打包到一起
    platform: "browser", //打包后给浏览器使用
    sourcemap: true, //可以调试源代码
    format, //cjs esm iife
    globalName: pkg.buildOPtions?.name, //全局变量名（如果是iife，因为iife是立即执行函数 没办法获取到返回的值，所以需要全局变量名）
  })
  .then(async (ctx) => {
    console.log("start dev");
    return ctx.watch(); //监控入口文件持续进行打包处理
  });
